import XEUtils from 'xe-utils';
import { dataFormatValues, numberFormatValues, accountFormatValues } from  './table-constant'

/**
 * 获取合计行数据
 *
 * @param {Object} param1 { columns, data }
 * @param {Object} param2 {
 *   row: 合计行数据
 *   title: '合计标题',
 *   fields: 合计列的字段,
 *   formats: 合计列的格式化信息,
 *  }
 * @returns row 合计行数据
 */
export const getTotaledRow = ({ columns, data }, { title = '合计', fields, formats, row = [] }) => {
  columns.forEach(col => {
    if (fields.includes(col.field)) {
      const value = formatterNumberOrDate(XEUtils.sum(data, col.field), formats[col.field])
      row.push(value)
    } else {
      row.push('')
    }
    if (col.children && col.children.length) {
      getTotaledRow({ columns: col.children, data }, fields, formats, row)
    }
  })
  row.splice(0, 1, title);
  return row
}
/**
 * 获取平均数行数据
 *
 * @param {Object} param1 { columns, data }
 * @param {Object} param2 {
 *   row: 行数据
 *   title: '标题',
 *   fields: 列的字段,
 *   formats: 列的格式化信息,
 *  }
 * @returns row 行数据
 */
export const getAverageRow = ({ columns, data }, { title = '平均', fields, formats, row = [] }) => {
  columns.forEach(col => {
    if (fields.includes(col.field)) {
      const value = formatterNumberOrDate(XEUtils.mean(data, col.field), formats[col.field])
      row.push(value)
    } else {
      row.push('')
    }
    if (col.children && col.children.length) {
      getAverageRow({ columns: col.children, data }, fields, formats, row)
    }
  })
  row.splice(0, 1, title);
  return row
}

// ------ formatter
/**
 * 数字或日期格式化
 *
 * @param {Object} param 参数信息 { cellValue, row, column }
 * @param {String} rule 格式化规则
 * @returns 格式化后的数据
 */
export const formatterNumberOrDate = (cellValue, rule) => {
  let resultValue = cellValue
  // 日期类型
  if (rule && dataFormatValues.includes(rule)) {
    resultValue = XEUtils.toDateString(resultValue, rule)
  }
  // 数字类型
  if (rule && numberFormatValues.includes(rule)) {
    const digitItem = rule.split('.')[1]
    let digits = 0
    if (digitItem) digits = (digitItem.match(/0/g) || []).length
    resultValue = XEUtils.commafy(resultValue, { digits })
  }
  // 银行账号
  if (rule && accountFormatValues.includes(rule)) {
    resultValue = resultValue.replace(/(\d{4})(?=\d)/g, "$1 ")
  }
  return resultValue || ''
}

export default {
  /**
   * 转换为短横线命名
   *
   * @param {String} name 需要转换的名称
   */
  toKebabCase: (name) => {
    const result = name.replace(/([A-Z])/g, (match, p1, offset, string) => {
      // 一个捕获组捕获全部，所以match等于p1
      return '-' + p1.toLowerCase();
    });
    return result
  },
  /**
   * 转换为驼峰式命名
   *
   * @param {String} name 需要转换的名称
   */
  toCamelCase: (name) => {
    const result = name.replace(/(\-([a-z]))/g, (match, p1, p2, offset, string) => {
      // 这里有两个捕获组，第一个捕获组捕获全部并包含了第二个捕获组，所以match等于p1
      return p2.toUpperCase();
    });
    return result
  }
}
